Plots inline:
In [1]:
%matplotlib inline
Imports:
In [2]:
import os
import numpy as np
from matplotlib import pyplot as plt
from scipy.ndimage import convolve
from skimage.filters import gabor_kernel
from skimage.color import rgb2grey
from skimage.util.montage import montage2d
from skimage.transform import downscale_local_mean
Some utility functions for making an image montage for display and padding images:
In [3]:
def image_montage(im_3d, padding=1, cval=None):
if cval is None:
return montage2d(np.pad(im_3d, [(0,0), (padding, padding), (padding, padding)], mode='constant'))
else:
return montage2d(np.pad(im_3d, [(0,0), (padding, padding), (padding, padding)], mode='constant',
constant_values=[(0,0), (cval,cval), (cval,cval)]))
def pad_image(img, shape):
d0 = shape[0]-img.shape[0]
d1 = shape[1]-img.shape[1]
p0a = d0/2
p0b = d0-p0a
p1a = d1/2
p1b = d1-p1a
return np.pad(img, [(p0a, p0b), (p1a, p1b)], mode='constant')
Load the photo with the peacock, but extract a region with less texture:
In [4]:
IMAGE_PATH = os.path.join('images', 'fruit.JPG')
# Extract a square block
img = rgb2grey(plt.imread(IMAGE_PATH)[:1536,0:1536])
print img.shape
plt.imshow(img, cmap='gray')
plt.show()
In [11]:
# Scale the image down to 192 x 192
scale_factor = img.shape[0] // 96, img.shape[1] // 96
img_small = downscale_local_mean(img, scale_factor)
plt.imsave(os.path.join('images', 'gabor_banana.png'), img_small, cmap='gray')
plt.imshow(img_small, cmap='gray')
plt.show()
In [12]:
kernels = []
for wavelength in [4.0, 8.0]:
for theta in np.linspace(0.0, np.pi, 7)[:-1]:
k_complex = gabor_kernel(1.0/wavelength, theta, 1.2)
kernels.append(np.imag(k_complex))
kernels.append(np.real(k_complex))
shape = (np.max([k.shape[0] for k in kernels]), np.max([k.shape[1] for k in kernels]))
kernels = [pad_image(k, shape) for k in kernels]
k_3d = np.concatenate([k[None,:,:] for k in kernels], axis=0)
k_montage = image_montage(k_3d)
plt.imsave(os.path.join('images', 'gabor_filters.png'), k_montage, cmap='gray')
plt.imshow(k_montage, cmap='gray', interpolation='none')
Out[12]:
In [13]:
img_features = [-convolve(1-img_small, k) for k in kernels]
feads_3d = np.concatenate([c[None,:,:] for c in img_features], axis=0)
feats_montage = image_montage(feads_3d)
plt.imsave(os.path.join('images', 'gabor_filtered_bananas.png'), feats_montage, cmap='gray')
plt.figure(figsize=(12,12))
plt.imshow(feats_montage, cmap='gray', interpolation='none')
Out[13]: